本文仅供研究和测试,请勿将其用于任何收费或违法活动,后果自负。

原理

在未进行校园网认证的情况下,通常不会屏蔽 DNS 查询(53 端口)。因此,可通过在 53 端口运行 Hysteria 2 或基于 UDP 的 mKCP 等来建立通信。

准备工作

需要一台远程服务器,不建议使用国外服务器。

所需条件

  • 未认证时不封锁 53 端口的校园网
  • 一台远程服务器(Linux 或 Windows 均可,这里以 Linux 为例,建议使用国内服务器。)
  • 支持 Hysteria 2 或其他底层传输协议为 UDP 协议的客户端,比如:

验证 53 端口是否开放

在未进行校园网认证时,打开命令提示符(CMD)并执行:

1
nslookup www.baidu.com 223.5.5.5

如果返回的服务器字段显示为 unknown,则表示 53 端口可能被封锁,本方法可能不适用。

可用示例:

53端口开放
53端口开放

不可用示例(内网 53 端口开放,但访问外网 53 端口被封锁):

外网53端口封锁
外网53端口封锁
内网53端口开放
内网53端口开放

不可用配图为深圳大学校园网,使用 drcom 认证)

为什么建议使用国内服务器?

UDP 协议本身具有明显的流量特征,且 mKCP 的加密方式容易被识别,可能导致服务器 IP 被封禁。

优点:

  • 国内服务器的延迟更低,尤其是校园网环境。
  • 可以使用国内的 app ,不会被反向墙封锁,但部分网购网站会封锁数据中心 IP
  • 国内服务器的流量特征更容易伪装成 DNS 流量。
  • 如果使用国外服务器,可能会被GWF的深度包检测(DPI)识别并封锁。
  • 实测教育网会对大量 UDP 流量封端口。(53端口未测试)

缺点:

  • 国内服务器的流量更贵。

解决 systemd-resolved 占用 53 端口

如果 53 端口被 systemd-resolved 占用,可以尝试以下方法解决:

方法一:使用 iptables 转发(推荐)

  1. 安装 iptables-persistent
1
sudo apt install iptables-persistent

安装过程中选择 YES 并回车。

  1. 添加 NAT 规则:
将目标端口为 53 的 UDP 数据包重定向到本地服务器的 5353 端口
1
2
iptables -t nat -A PREROUTING -p udp --dport 53 -j DNAT --to-destination :5353
ip6tables -t nat -A PREROUTING -p udp --dport 53 -j DNAT --to-destination :5353
  1. 保存 iptables 规则:
1
netfilter-persistent save
  1. 将后续教程中的 53 端口改为 5353。

方法二:禁用 systemd-resolved

  1. 停止 systemd-resolved 服务:
1
sudo systemctl stop systemd-resolved
  1. 编辑 /etc/systemd/resolved.conf 文件:
1
sudo nano /etc/systemd/resolved.conf

修改内容如下:

1
2
3
[Resolve]
DNS=223.5.5.5
DNSStubListener=no
  1. 创建符号链接:
1
ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

搭建教程

协议介绍

考虑到要伪装成跑在 53 端口的 DNS 流量,所以需要使用底层协议为 UDP 的代理协议。

常见基于 UDP 传输协议:

对比

以下对比仅针对伪装成 53 端口 DNS 流量的情况。

协议 优点 缺点 客户端支持
共同特性 基于 UDP 传输
适合绕过 TCP 封锁
UDP 流量可能被 QoS 限制
在严格过滤环境中可能被识别封锁
-
mKCP 可将流量伪装成 DNS 请求
底层传输协议,可与其他协议配合
仅 v2ray 和 xray 支持
仅 xray 支持流量伪装成 DNS 请求
确认包重传机制消耗更多流量
Windows: v2rayN (7.10.3+)
Android: v2rayNG (1.9.40+)Neko-rayXray
Hysteria 2 支持 0-RTT UDP 会话建立,减少延迟
采用 Brutal 拥塞控制算法
xray 不支持
将流量伪装为 HTTP/3,无法伪装成 DNS 流量
几乎所有主流代理客户端
TUIC 支持 0-RTT UDP 会话建立
轻量化设计,资源占用低
基于 QUIC 协议
无法伪装成 DNS 流量
对恶劣网络环境优化不足
生态支持较新(2023年7月停更,2025年2月恢复更新)
支持 sing-box 和 tuic 核心的客户端
WireGuard 内置 TLS 1.3 加密
多路复用减少连接开销
对丢包和高延迟网络优化良好
无法伪装成 DNS 流量
实现复杂
几乎所有主流代理客户端
XHTTP 支持上下行分离
可伪装为 HTTP/3 或 HTTP/2
支持多个 UDP 流量的聚合传输
无法伪装成 DNS 流量
配置复杂
仅 Xray 支持
Windows: v2rayN
Android: v2rayNG

考虑到校园网不太可能搭载深度包检测,所以现阶段优先推荐 Hysteria 2,其次推荐 mKCP

方法一:Hysteria 2

Hysteria 2 文档

搭建 Hysteria 2 服务器

远程服务器上安装 Hysteria 2

参考官方文档

1
bash <(curl -fsSL https://get.hy2.sh/)

如果服务器在国内,下载可能缓慢。可手动上传 Hysteria 可执行文件到服务器,然后执行:

1
bash <(curl -fsSL https://get.hy2.sh/) --local /path/to/hysteria-linux-amd64

安装完成后,设置开机自启:

1
sudo systemctl enable hysteria-server.service
生成自签证书

将伪装域名设置为 dns.alidns.com,可根据需要更改(需要 root 权限):

1
openssl req -x509 -nodes -newkey ec:<(openssl ecparam -name prime256v1) -keyout /etc/hysteria/server.key -out /etc/hysteria/server.crt -subj "/CN=dns.alidns.com" -addext "subjectAltName=DNS:dns.alidns.com" -days 36500 && chown hysteria /etc/hysteria/server.key && chown hysteria /etc/hysteria/server.crt
编辑 config.yaml 并设置端口与密码
1
sudo nano /etc/hysteria/config.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
listen: :53

tls:
cert: /etc/hysteria/server.crt
key: /etc/hysteria/server.key

auth:
type: password
password: 123456

masquerade:
type: proxy
proxy:
url: https://dns.alidns.com
rewriteHost: true

启动 Hysteria 2

1
sudo systemctl restart hysteria-server.service
检查 Hysteria 2 运行状态
1
sudo systemctl status hysteria-server.service

出现 active (running) 即表示成功,否则检查端口占用、证书、防火墙等。还需在云服务器管理平台放行 53 端口。

连接到 Hysteria 2

客户端中:

  • 地址:服务器域名或 IP
  • 端口:53
  • 密码:设置的密码
  • 传输层安全(TLS):tls
  • SNI:dns.alidns.com
  • 跳过证书验证(建议配置自签证书的 pinSHA256 或 证书)

关闭分应用代理并切换到全局规则,建议搭配tun模式。

方法二:mKCP

这里使用 Xray-core 举例,也可以使用 v2fly-v5 sing-box(不支持mKCP传输协议,可尝试quic) 等。

Xray-core 文档

使用 VMess + mKCP,此处仅作示例。

也可以使用:

  • Vless + tls + mKCP
  • Trojan + tls + mKCP

搭建 VLESS 服务器

安装 Xray-core

参考官方文档

编辑配置文件

默认路径为 /usr/local/etc/xray/config.json,可参考示例修改。

入站示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
"listen": "0.0.0.0",
"port": 53,
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "af525cf3-82a2-43c8-922a-b95eab605bc4"
}
]
},
"streamSettings": {
"network": "kcp",
"kcpSettings": {
"header": {
"type": "dns",
"domain": "dns.alidns.com"
}
}
},
"sniffing": {
"enabled": true,
"destOverride": [
"http",
"tls",
"quic"
]
}
}

启动 Xray-core

1
sudo systemctl restart xray
检查 Xray-core 运行状态
1
sudo systemctl status xray

同样需要放行 53 端口并检查防火墙。

连接到 Xray-core

v2rayN V7.10.3及以后版本支持 dns 伪装。#6852
v2rayNG V1.9.40及以后版本支持 dns 伪装。#4368

客户端中:

  • 地址:服务器域名或 IP
  • 端口:53
  • UUID:配置文件中的 uuid
  • 加密方式、传输层安全:none
  • 传输协议:kcp
  • 伪装类型:dns
  • 伪装域名:dns.alidns.com

关闭分应用代理并切换到全局规则,建议搭配tun模式。

使用方法

如果相关配置正确,连接后即可在未认证的校园网环境中正常访问外网。